# 函数闭包+嵌套

""""
嵌套：
    注意：
        1. 内部函数可以使用外部函数的变量
        2. 内部函数不能修改外部函数的变量，nonlocal a  可以修改外部函数变量需要再内部函数中，添加nolocal
闭包：（函数、变量都是如下顺序）
    内层函数-------> 全局函数--------->外层函数-------->系统函数（builtins）
    闭包三个特点：
        1. 嵌套函数
        2. 内部函数引用了外部函数的变量
        3. 返回值是内部函数
    使用场景：
        装饰器使用
"""


def outer():
    a = 100

    def inner():
        nonlocal a  # 引用外函数变量
        b = 200
        b += a
        a += b
        print("我是内函数！", b)

    result = locals()  # 局部变量查看，以字典形式返回：{'a': 100, 'inner': <function outer.<locals>.inner at 0x00000247463281F8>}
    print(result)
    print(a)
    print(inner)  # <function outer.<locals>.inner at 0x0000017531E381F8>
    inner()  # 调用
    print(a)  # a 被 nonlocal  局部函数修改

    return inner


r = outer()  # <function outer.<locals>.inner at 0x00000236F60381F8>

print(r)

print("闭包".center(30, '*'))

r()  # 调用内部函数
